package com.cskaoyan.javase.oop3._0abstract._1basic;

/**
 * 抽象类的定义:
 * 在继承体系中，从祖先类开始，随着一个个子类的定义，子类变得越来越具体
 * 而祖先类则更具有一般性和抽象性。
 * 在这种情况下，为了体现祖先类在设计上的抽象性，我们只将该类作为派生其他类的父类
 * 而不能创建对象实例。这个时候，这样的类，我们称之为抽象类。
 *
 * 以上,一句话总结,抽象类是作为继承层次中的祖先类而存在的
 * 只有继承层次中的祖先类才有必要定义为抽象类
 * 实际开发中,我们可能偶尔接触抽象类,但并不会经常使用它,定义抽象类就更少了.
 *
 * 抽象类的特点我们主要从以下角度：
 * 抽象类定义的语法:
 * [修饰符列表] abstract class 类名{
 *     //类体
 * }
 *      1.抽象类名命名特点
 *          抽象类也是类,遵循大驼峰的命名规范,"见名知意",尽量用合法的英文单词
 *          在很多时候,程序员习惯抽象类的命名以"Base"或者"Abstract"开头
 *      2.能用哪些修饰符？
 *          肯定可以用访问权限修饰符
 *          但是不能用final修饰
 *          Illegal combination of modifiers: 'final' and 'abstract'
 *          abstract和final是天生对立的,不能放在一起
 *      3.成员特点
 *          普通成员,和普通类一样,都可以定义
 *              小tips:
 *              抽象类为什么有实现方法?
 *              首先这是语法设计,你不爽你去问设计师
 *              实际上,假如抽象类的所有子类都需要一个方法,并且需要一个默认实现
 *              那么这个默认实现就可以写在抽象类中
 *              这时:
 *                  子类要么直接使用
 *                  要么重写后再使用
 *                  决定权在子类手里
 *
 *          静态成员,和普通类一样,都可以定义
 *
 *          抽象方法是抽象类中独有能够定义的结构
 *              抽象类可以没有抽象方法,但是没有抽象方法的抽象类没有意义
 *              一般来说,抽象类都必须有抽象方法
 *              抽象类是作为继承层次的祖先类而存在,不要在别的场景滥用它
 *              抽象方法的语法:
 *              [修饰符列表] abstract 返回值类型 方法名(形参列表);
 *              一旦抽象父类定义抽象方法,那么一个普通的子类必须实现这个抽象方法
 *              抽象方法起着"占位"的作用,制定"标准,规范"的作用
 *
 *          构造器,有,和普通类一样
 *          构造器的作用:
 *              a.new自己对象时,给自身成员变量赋值(自己用,抽象类不行)
 *              b.new子类对象时,子类对象初始化会依赖父类构造器(给子类用,抽象类也有子类)
 *
 *          代码块,既然有构造器,那就也有构造代码块 并且也有静态代码块
 *
 * 以上,抽象类和普通类相比较,可以定义普通类中允许定义的一切结构,还多了抽象方法的定义
 * 实际上,如果不考虑new对象,那么直接找一个普通类,声明为抽象,会报错吗? 不会
 *
 * 抽象类的使用，我们主要探讨，它的子类特点。
 * 抽象类的子类:
 *  a.普通类,必须强制实现抽象父类中的抽象方法
 *  b.抽象类,不强制实现抽象父类中的抽象方法,当然你愿意也可以选择性的实现
 *
 * 抽象类的父类:
 *  a.抽象类,完全可以,会继承抽象类的成员和抽象方法
 *  b.普通类,也完全可以,实际上如果一个抽象类没有明确指向直接父类
 *          那么Object类就是它的直接父类
 *
 * @since 15:58
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public abstract class BasePerson {
    int a;
    private int b;
    static int c;
    private static final int D = 10;

    {}
    static {}

    public BasePerson() {
    }

    public BasePerson(int a, int b) {
        this.a = a;
        this.b = b;
    }

    // 实现方法是给子类用的
    public void test() {
    }


    public static void testStatic() {
    }

    // 定义抽象方法
    public abstract void testAbstract();

}
